#!/usr/bin/env python

################################################################################
# Python Standard Library
################################################################################

import struct

################################################################################
# Includes
################################################################################

from protocols.bn import BNPacket, BNSocket
from protocols.chat import ChatPacket, ChatSocket
from protocols.server import ServerPacket, ServerSocket

################################################################################
# Packets
################################################################################

KeepAlive 								= "\x00"
EnterChatResponse 						= "\x0A"
ChannelList 							= "\x0B"
ChatEvent 								= "\x0F"
AdInfo 									= "\x15"
BnetPing 								= "\x25"
FileTimeInfo 							= "\x33"
BnetLogonResponse 						= "\x3a"
RealmLogonResponse 						= "\x3e"
QueryRealmsResponse 					= "\x40"
NewsInfo 								= "\x46"
ExtraWorkInfo 							= "\x4a"
RequiredExtraWorkInfo 					= "\x4c"
BnetConnectionResponse 					= "\x50"
BnetAuthResponse 						= "\x51"
Invalid 								= "\x83"

################################################################################
# Packet Handlers
################################################################################

class BNCSPacket(BNPacket, ChatPacket, ServerPacket):
	"""
	Battle.net Chat Server Packet
	"""
	
	def __init__(self):
		BNPacket.__init__(self)
		ChatPacket.__init__(self)
		ServerPacket.__init__(self)
	
	def unpack(self):
		print "Unpacking BNCS packet..."
		
		self.dispatchEvent("unpack", (self,))
		
		print "BNCS packet unpacked."
	
	def pack(self):
		print "Packing BNCS packet..."
		
		self.dispatchEvent("pack", (self,))
		
		print "BNCS packet packed."
		
		return self.message

################################################################################
# Socket Handlers
################################################################################

class BNCSSocket(BNSocket, ChatSocket, ServerSocket):
	"""
	Battle.net Chat Server Socket
	"""
	
	def __init__(self, sock = None):
		BNSocket.__init__(self, sock)
		ChatSocket.__init__(self, sock)
		ServerSocket.__init__(self, sock)

	def unpackPackets(self):
		i, l = 0, len(self.data)
		
		while i < l:
			packet = BNCSPacket()
			packet.socket = self
			packet.messageID = self.data[i+1]
			packet.messageLength = struct.unpack("<H", self.data[i+2:i+4])[0]
			packet.messageData = self.data[i+4:i+packet.messageLength-4]
			packet.message = self.data[i:i+packet.messageLength]
			
			packet.unpack()
			
			self.packets.append(packet)
			
			i += packet.messageLength
		
		self.data = ''